package leetcode.hash;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test18 {
    //    给你一个由 n 个整数组成的数组 nums ，和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] ：
//
//            0 <= a, b, c, d < n
//    a、b、c 和 d 互不相同
//    nums[a] + nums[b] + nums[c] + nums[d] == target
//    你可以按 任意顺序 返回答案 。
//
//             
//
//    来源：力扣（LeetCode）
//    链接：https://leetcode-cn.com/problems/4sum
//    著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

    public static void main(String[] args) {
        int[] nums = {1,-2,-5,-4,-3,3,3,5};
        int target = -11;
        List<List<Integer>> lists = fourSum(nums, target);
        lists.forEach(list->{
            list.forEach(a->{
                System.out.print(a+" ");
            });
            System.out.println();
        });
    }
    public static List<List<Integer>> fourSum(int[] nums, int target) {
        Arrays.sort(nums);
        List<List<Integer>> list = new ArrayList<>();
        int length = nums.length;
        for (int i = 0; i < length - 3; i++) {
            if (i>0 && nums[i]==nums[i-1]){
                continue;
            }
            int i1 = target - nums[i];
            for (int j = i+1; j< length -2; j++){
                int i2 = i1 - nums[j];
                if (j>i+1 && nums[j] == nums[j-1]){
                    continue ;
                }
                int left = j+1,right = length -1;
                while (left<right){
                    if (left>j+1 && nums[left] == nums[left-1]){
                        left++;
                        continue;
                    }
                    if (right< length - 1 &&nums[right] == nums[right+1]){
                        right--;
                        continue;
                    }
                    int i3 = nums[left] + nums[right];
                    if (i3 == i2){
                        List<Integer> child = new ArrayList<>();
                        child.add(nums[i]);
                        child.add(nums[j]);
                        child.add(nums[left]);
                        child.add(nums[right]);
                        list.add(child);
                        left++;
                        right--;
                    }
                    else if (i3 > i2){
                        right--;
                    }
                    else{
                        left++;
                    }
                }

            }

        }
        return list;
    }
}
